package basic.kotlin.function

/**
 * 测试 属性和方法  属性的getter 和setter是默认实现，也可以手动重写
 *
 * 默认访问修饰符 public
 * 私有的：protected、private
 *
 * lateinit 是属性延迟初始化修饰符
 *
 *
 */

class Score

class Stu{
    var age = 0  // getter 和 setter 只能放在当前属性的正下方
    get() {
        println("测试getter方法")
        return field
    }
    set(value) {
        println("测试setter方法")
        field=value
    }

    lateinit var name: String  // 字符串引用类型懒加载赋值  在使用是必须初始化

    lateinit var score: Score      // 自定义对象类型懒加载赋值  在使用是必须初始化

    val e: Score by lazy {         // val 修饰的懒加载赋值，通过 by lazy ，在使用是必须初始化
        println("初始化 Score")
        Score()
    }

    var cc: String? = null
}

fun main(args: Array<String>) {
    val stu = Stu()
    println(stu.age)  // 等价于 stu.getAge()
    stu.age=30
    println(stu.age)  // 使用之前需要初始化

    stu.name="张三"    // 使用之前需要初始化
    println(stu.name)  // lateinit property name has not been initialized

    println(stu.e)    // 在定义时初始化

    stu.score = Score()     // 初始化赋值
    println(stu.score)      // 打印的对象名,使用之前初始化
    println(stu.cc?.length) // 空值的条件判断
}